// WIP - NOT REALLY IMPLEMENTED!!!
// ======================================================
// uDisplay_DSI_panel.h - MIPI-DSI Display Panel Implementation  
// ======================================================

#pragma once
#ifdef ESP32
#if __has_include("soc/soc_caps.h")
# include "soc/soc_caps.h"
#else
# error "No ESP capability header found"
#endif

#if SOC_MIPI_DSI_SUPPORTED

#include "uDisplay_panel.h"
#include "esp_lcd_panel_interface.h"
#include "esp_lcd_panel_io.h"
#include "esp_lcd_panel_ops.h"
#include "esp_lcd_mipi_dsi.h"
#include "esp_ldo_regulator.h"

struct DSIPanelConfig {
    // Basic display info
    uint16_t width;
    uint16_t height;
    uint8_t bpp;                    // 24
    
    // DSI parameters (from :H line)
    uint8_t dsi_lanes;              // 2
    int8_t te_pin;                  // -1 (no TE)
    int8_t reset_pin;               // -1 (no reset control)
    int ldo_channel;                // 3  
    int ldo_voltage_mv;             // 2500
    uint32_t pixel_clock_hz;        // 54000000
    uint32_t lane_speed_mbps;       // 750
    uint8_t rgb_order;              // 0=RGB, 1=BGR
    uint8_t data_endian;            // 0=Big, 1=Little
    
    // Video timing (from :V line)
    struct {
        uint16_t h_front_porch;     // 160
        uint16_t v_front_porch;     // 40  
        uint16_t h_back_porch;      // 160
        uint16_t h_sync_pulse;      // 12
        uint16_t v_sync_pulse;      // 10
        uint16_t v_back_porch;      // 23
    } timing;
    
    // Init commands (from :I section)
    uint8_t* init_commands;
    uint16_t init_commands_count;
    
    // Display on/off commands (from :O and :o lines)
    uint8_t cmd_display_on;   // 0x29
    uint8_t cmd_display_off;  // 0x28
};

class DSIPanel : public UniversalPanel {
public:
    // Constructor - takes ESP-IDF panel handle (already initialized)
    DSIPanel(const DSIPanelConfig& config);
    ~DSIPanel();
    
    // Core graphics API (must return bool)
    bool drawPixel(int16_t x, int16_t y, uint16_t color) override;
    bool fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) override;
    bool pushColors(uint16_t *data, uint16_t len, bool not_swapped) override;
    bool setAddrWindow(int16_t x0, int16_t y0, int16_t x1, int16_t y1) override;
    bool drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) override;
    bool drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) override;

    // Control API
    bool displayOnff(int8_t on) override;
    bool invertDisplay(bool invert) override;
    bool setRotation(uint8_t rotation) override;
    bool updateFrame() override;
    
    // Get direct framebuffer access (for DPI mode)
    uint16_t* framebuffer = nullptr;

private:
    // ESP-IDF panel handle
    esp_lcd_panel_handle_t panel_handle = nullptr;
    esp_lcd_panel_io_handle_t io_handle = nullptr;
    esp_ldo_channel_handle_t ldo_handle = nullptr;
    DSIPanelConfig cfg;
    void sendInitCommandsDBI();
    
    // Display parameters
    uint8_t rotation = 0;

    // Address window tracking
    int16_t window_x0 = 0;
    int16_t window_y0 = 0;
    int16_t window_x1 = 0;
    int16_t window_y1 = 0;
    size_t framebuffer_size = 0;
    uint32_t framebuffer_dirty = false;
};

#endif // SOC_MIPI_DSI_SUPPORTED
#endif // ESP32